package com.turing.post.account.util;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

import javax.ejb.Local;
import javax.ejb.Remote;

import com.turing.post.util.PCPSApplicationException;

/**
 * 帐户子系统业务逻辑接口
 * 
 * @author yxb
 * @date 2012-12-17
 */
@Remote
@Local
public interface AccountBusiness {

	/**
	 * 批量开户
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param openBranchNo
	 *            开户机构号
	 * @param ticketId
	 *            相关业务单ID
	 * @param tranDate
	 *            帐务日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易系统流水号
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            开户摘要
	 * @param openAccountParamList
	 *            每户的具体参数
	 * @param salesList
	 *            销售员列表
	 * @param transferMap
	 *            转账明细
	 * @return 批量开户返回结果
	 */
	public OpenAccountResult OpenAccount(String issueCompanyNo,
			String openBranchNo, BigInteger ticketId, Date tranDate,
			Date tranTime, String tranSeqNo, BigInteger operId, String summary,
			ArrayList<OpenAccountParam> openAccountParamList,
			ArrayList<SalesGroup> salesList,
			Map<String, Map<BigInteger, BigInteger>> transferMap)
			throws PCPSApplicationException;

	/**
	 * 批量开户取消
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param tranDate
	 *            当前帐务日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易流水号
	 * @param cancelAccSeqNo
	 *            被取消的帐户子系统流水号
	 * @param operId
	 *            当前操作员ID
	 * @param summary
	 *            取消摘要
	 * @return 帐户子系统新流水号
	 * @throws PCPSApplicationException
	 */
	public String OpenAccountCancel(String issueCompanyNo, Date tranDate,
			Date tranTime, String tranSeqNo, String cancelAccSeqNo,
			BigInteger operId, String summary) throws PCPSApplicationException;

	/**
	 * 记帐
	 * 
	 * @param issueCompanyNo
	 *            发卡方
	 * @param tranDate
	 *            交易日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易流水
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            摘要
	 * @param accountParamList
	 *            具体的记帐参数
	 * @return 记帐流水号
	 * @throws PCPSApplicationException
	 */
	public String Account(String issueCompanyNo, Date tranDate, Date tranTime,
			String tranSeqNo, BigInteger operId, String summary,
			ArrayList<AccountParam> accountParamList)
			throws PCPSApplicationException;

	/**
	 * 撤销记帐
	 * 
	 * @param issueCompanyNo
	 *            发卡方
	 * @param tranDate
	 *            交易日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易流水
	 * @param cancelAccSeqNo
	 *            被撤销帐户子系统流水
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            摘要
	 * @return 记帐流水号
	 * @throws PCPSApplicationException
	 */
	public String AccountCancel(String issueCompanyNo, Date tranDate,
			Date tranTime, String tranSeqNo, String cancelAccSeqNo,
			BigInteger operId, String summary) throws PCPSApplicationException;

	/**
	 * 重新记帐
	 * 
	 * @param issueCompanyNo
	 *            发卡方
	 * @param tranDate
	 *            交易日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易流水
	 * @param origAccSeqNo
	 *            原始帐户子系统流水
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            摘要
	 * @return 记帐流水号
	 * @throws PCPSApplicationException
	 */
	public String redoAccount(String issueCompanyNo, Date tranDate,
			Date tranTime, String tranSeqNo, String origAccSeqNo,
			BigInteger operId, String summary) throws PCPSApplicationException;

	/**
	 * 充值
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param openBranchNo
	 *            开户机构号
	 * @param ticketId
	 *            相关业务单ID
	 * @param tranDate
	 *            帐务日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易系统流水号
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            充值摘要
	 * @param depositAccountParamList
	 *            每户的具体参数
	 * @param salesList
	 *            销售员列表
	 * @param transferMap
	 *            转账明细
	 * @return 充值流水号
	 */
	public DepositAccountResult DepositAccount(String issueCompanyNo,
			String openBranchNo, BigInteger ticketId, Date tranDate,
			Date tranTime, String tranSeqNo, BigInteger operId, String summary,
			ArrayList<DepositAccountParam> depositAccountParamList,
			ArrayList<SalesGroup> salesList,
			Map<BigInteger, Map<BigInteger, BigInteger>> transferMap)
			throws PCPSApplicationException;

	/**
	 * 冻结状态操作
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            冻结/解冻结摘要
	 * @param masAccNoList
	 *            主帐号列表
	 * @param isfree
	 *            是否解除
	 * @return 处理流水号
	 */
	public String FreezeAccount(String issueCompanyNo, BigInteger operId,
			String summary, Map<BigInteger, BigInteger> masAccNoMap,
			boolean isfree) throws PCPSApplicationException;

	/**
	 * 止付状态操作
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            止付/解止付摘要
	 * @param masAccNoList
	 *            主帐号列表
	 * @param isfree
	 *            是否解除
	 * @return 处理流水号
	 */
	public String StopPaymentAccount(String issueCompanyNo, BigInteger operId,
			String summary, Map<BigInteger, BigInteger> masAccNoMap,
			boolean isfree) throws PCPSApplicationException;

	/**
	 * 批量开户
	 * 
	 * @param issueCompanyNo
	 *            发卡商
	 * @param openBranchNo
	 *            开户机构号
	 * @param ticketId
	 *            相关业务单ID
	 * @param tranDate
	 *            帐务日期
	 * @param tranTime
	 *            记帐时间
	 * @param tranSeqNo
	 *            交易系统流水号
	 * @param operId
	 *            操作员ID
	 * @param summary
	 *            开户摘要
	 * @param openAccountParamList
	 *            每户的具体参数
	 * @return 批量开户返回结果
	 */
	public OpenAccountResult OpenAppManageAccount(String issueCompanyNo,
			String openBranchNo, BigInteger ticketId, Date tranDate,
			Date tranTime, String tranSeqNo, BigInteger operId, String summary,
			ArrayList<OpenAccountParam> openAccountParamList)
			throws PCPSApplicationException;

	/**
	 * 以下为产生压力测试数据代码
	 * 
	 * @param subaccno
	 * @throws PCPSApplicationException
	 */
	public void generateAccDetail(String issueCompanyNo, BigInteger subaccno,
			Date tranDate, Date tranTime) throws PCPSApplicationException;

	public void genAccDetail(String issueCompanyNo,BigInteger seqno, String startDate, String endDate);
}
